#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>
#include <sys/shm.h>   
//#include <sys/ipc.h>
//#include <sys/types.h>
#include "shmdata.h"  

int main()  
{  
    int running = 1;  
    void *shm = NULL;      //分配的共享内存的原始首地址
    struct shared_use_st *shared = NULL;  
    char buffer[BUFSIZ + 1];     //用于保存输入的文本  
    int shmid;  
        
    /*----创建共享内存---------------------------------*/  
    shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);  
   
    if(shmid == -1)  
    {  
       fprintf(stderr, "shmget failed\n");  
       exit(EXIT_FAILURE);  
    }  
   
    /*----将共享内存连接到当前进程的地址空间------------*/
    shm = shmat(shmid, (void*)0, 0);  
    if(shm == (void*)-1)  
    {  
       fprintf(stderr, "shmat failed\n");  
       exit(EXIT_FAILURE);  
    }  
    printf("Shared-Memory attached at %ld\n", (long int)shm);  //在64位操作系统中，指针占8个字节，可用是long int 型；
                                                       //在32位操作系统中，指针占4个字节，可以转为int型，输出%d或%x
        
    /*----设置共享内存---------------------------------*/  
    shared = (struct shared_use_st*)shm;  
   
    while(running)            //向共享内存中写数据  
    {  
       //数据还没有被读取，则等待数据被读取,不能向共享内存中写入文本  
       while(shared->written == 1)  
       {  
          sleep(1);  
          printf("Waiting...\n");
       }  
            
       //向共享内存中写入数据  
       printf("Input your text: ");  
       fgets(buffer, BUFSIZ, stdin);  
       strncpy(shared->text, buffer, TEXT_SZ);  
            
       //写完数据，设置written使共享内存段可读  
       shared->written = 1;  
          
       //输入end，退出循环（程序）  
       if(strncmp(buffer, "end", 3) == 0)  
          running = 0;  
    }  
       
    /*----把共享内存从当前进程中分离------------------*/       
       if(shmdt(shm) == -1)       
       {  
          fprintf(stderr, "shmdt failed\n");  
          exit(EXIT_FAILURE);  
       }  
       sleep(2);  
       exit(EXIT_SUCCESS);  
}  
